#pragma warning(disable:4267)
#pragma warning(disable:4996)
#pragma warning(disable:6031)
#pragma warning(disable:6011)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

typedef struct _Convert {
	int n10;
	int pos;
}ConvertT, * Convert;

static char Stack[2048] = {};
static int stack_index = 0;

static void stack_push(char c) {
	Stack[stack_index++] = c;
}

static void stack_push_chars(const char a[]) {
	int n = strlen(a);
	for (int i = n - 1; i >= 0; i--)
		Stack[stack_index++] = a[i];
}

static char stack_pop() {
	if(stack_index>0)
		return Stack[--stack_index];
	return 0;
}

static void base10to2(Convert convert) {
	while (convert->n10 > 0) {
		if (convert->n10 % 2) {
			switch (convert->pos)
			{
			case 0:
				stack_push_chars("+2(0)" );
				break;
			case 1:
				stack_push_chars("+2");
				break;
			default:
				ConvertT index = {};
				index.n10 = convert->pos;
				stack_push_chars(")");
				base10to2(&index);
				stack_push_chars("+2(");
				break;
			}
		}
		convert->n10 /= 2;
		convert->pos++;
	}
}

static void main1() {
	int n;
	int i;
	ConvertT base2_data = { 0 };
	scanf("%d", &n);
	base2_data.n10 = n;
	base2_data.pos = 0;
	base10to2(&base2_data);
	char tag = 0;
	for (int i = stack_index - 1; i >= 0; i--) {
		switch (tag)
		{
		case 0:
			break;
		case '(':
			if(Stack[i]!='+')
				printf("%c", Stack[i]);
			break;
		default:
			printf("%c", Stack[i]);
			break;
		}
		tag = Stack[i];
	}
	printf("\n");

}

//_Y190715_e02
int main__Y190715_e02() {
	main1();
	return 0;
}